package com.ucode.springboot.starter.ESsearch.repository;

import java.util.List;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.reindex.BulkByScrollResponse;

/**
 * ES 索引文档数据源基础操作方法接口
 * @author: liliang
 * @date: 2019年12月30日 下午5:12:02
 */
public interface ElasticsearchDocSourceTemplate<T, ID> {

    /**
     * 保存索引文档源
     * Id不存在则添加，存在则更新
     * @author liliang
     * @date 2020年1月8日
     * @param t 索引文档
     * @return 
     * @throws Exception
     */
    public boolean save(T t) throws Exception;
    
    /**
     * 指定路由,保存索引文档源
     * Id不存在则添加，存在则更新
     * @author liliang
     * @date 2020年1月8日
     * @param t 索引文档
     * @param routing 路由信息（默认路由为索引数据_id）
     * @return
     * @throws Exception
     */
    public boolean save(T t,String routing) throws Exception;
    
    /**
     * 批量保存索引文档,强烈建议分批方式，提升性能，防止es服务内存溢出
     * 注意：可以通过单线程压测得到最多一次性写多少条数性能最佳，总的来说一次最好不要超过10mb
     * Id不存在则添加，存在则更新
     * @author liliang
     * @date 2020年1月8日
     * @param list 索引文档集合
     * @return
     * @throws Exception
     */
    public BulkResponse save(List<T> list) throws Exception;
    
    /**
     * 更新索引文档
     * 注意：只会更新有值的字段
     * @author liliang
     * @date 2020年1月8日
     * @param t 索引文档集合
     * @return
     * @throws Exception
     */
    public boolean update(T t) throws Exception;
    
    /**
     * 批量更新索引文档，强烈建议分批方式，提升性能，防止es服务内存溢出
     * 注意：只会更新有值的字段
     * @author liliang
     * @date 2020年1月8日
     * @param list 索引文档集合
     * @return
     * @throws Exception
     */
    public BulkResponse update(List<T> list) throws Exception;
    
    /**
     * 根据queryBuilder所查结果，按照有值字段更新索引文档
     * @author liliang
     * @date 2020年1月8日
     * @param queryBuilder 查询条件
     * @param t 索引文档
     * @param clazz 索引文档类类型
     * @param limitcount 更新字段不能超出limitcount条
     * @param asyn true异步处理  否则同步处理
     * @return
     * @throws Exception
     */
    public BulkResponse update(QueryBuilder queryBuilder, T t, Class clazz, int limitcount, boolean asyn) throws Exception;

    /**
     * 覆盖更新索引文档
     * @author liliang
     * @date 2020年1月8日
     * @param t 索引文档
     * @return
     * @throws Exception
     */
    public boolean updateCover(T t) throws Exception;
    
    /**
     * 删除索引文档
     * @author liliang
     * @date 2020年1月8日
     * @param t 索引文档
     * @return
     * @throws Exception
     */
    public boolean delete(T t) throws Exception;

    /**
     * 指定路由,删除索引文档
     * @author liliang
     * @date 2020年1月8日
     * @param t 索引文档
     * @param routing 路由信息（默认路由为索引数据_id）
     * @return
     * @throws Exception
     */
    public boolean delete(T t,String routing) throws Exception;
    
    /**
     * 根据条件删除索引文档
     * 参考： https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-high-document-delete-by-query.html#java-rest-high-document-delete-by-query-response
     * @author liliang
     * @date 2020年1月8日
     * @param queryBuilder 查询条件
     * @param clazz 索引文档类类型
     * @return
     * @throws Exception
     */
    public BulkByScrollResponse delete(QueryBuilder queryBuilder, Class<T> clazz) throws Exception;
    
    /**
     * 根据索引文档主键删除索引文档
     * @author liliang
     * @date 2020年1月8日
     * @param id 索引文档主键
     * @param clazz
     * @return
     * @throws Exception
     */
    public boolean deleteById(ID id, Class<T> clazz) throws Exception;
    
    /**
     * 根据索引文档主键批量删除索引文档
     * @author liliang
     * @date 2020年3月3日
     * @param ids
     * @param clazz
     * @return
     * @throws Exception
     */
    public boolean deleteByIds(List<ID> ids, Class<T> clazz) throws Exception;
    
}
